package com.scott.ch080;

import java.util.Iterator;

/**
 * @author 黄后林
 * @version 1.0
 * @note 栈的实现
 * @date 2022-03-13 22:14:24
 */
public class Stack<T> implements Iterable<T> {

    @Override
    public Iterator<T> iterator() {
        return new MyIterator();
    }

    public class MyIterator implements Iterator{

        private Node node;

        public MyIterator(){
            this.node=head;
        }

        @Override
        public boolean hasNext() {
            if(node.next != null){
                return true;
            }
            return false;
        }

        @Override
        public Object next() {

            node=node.next;
            return node.item;
        }
    }

    private class Node{
        public T item;
        public Node next;

        public Node(T item,Node next){
            this.item=item;
            this.next=next;

        }

    }

    //使用head来记录头节点
    private Node head;

    //使用counter来记录栈中元素的个数 [ 今晚客栈中有几个客人? ]
    private int counter;

    //初始化一家客栈
    public Stack(){

        //头节点中不存储元素
        //因为目前就1个节点 所以暂时头节点不指向任何节点
        this.head=new Node(null,null);

        //客栈中没有客人=元素=节点=结点
        this.counter=0;

    }

    //如果当前栈中没有元素则返回true 否则返回false
    public boolean isEmpty(){
        if(this.counter ==0 ){
            return true;
        }
        return false;
    }

    // 获取栈中元素的个数
    public int size(){
        return this.counter;
    }

    //数据t进入栈中休息=压栈=增加1个元素
    public void push(T t){

        //1找到首节点指向的节点
        Node old = this.head.next;

        //2创建新的节点
        Node node = new Node(t,null);

        //3让首节点指向新的节点
        this.head.next=node;

        //4让新节点指向原来首节点指向的节点
        node.next=old;

        //5栈的元素个数+1
        this.counter++;
    }

    //数据t离开客栈=出栈=删除1个元素
    public T pop(){
        //1找到首节点指向的节点
        Node old = this.head.next;

        //2让首节点指向old的下一个节点
        if(old == null){
            return null;
        }
        this.head.next=old.next;

        //3让元素的个数-1
        this.counter--;

        return old.item;
    }
}
